<!DOCTYPE html>
<html>

<head>
  <title>Quarkus - Neo4j</title>
  <script id="adobe_dtm" src="https://www.redhat.com/dtm.js" type="text/javascript"></script>
  <script src="/assets/javascript/highlight.pack.js" type="text/javascript"></script>
  <META HTTP-EQUIV='Content-Security-Policy' CONTENT="default-src 'none'; script-src 'self' 'unsafe-eval' 'sha256-ANpuoVzuSex6VhqpYgsG25OHWVA1I+F6aGU04LoI+5s=' 'sha256-ipy9P/3rZZW06mTLAR0EnXvxSNcnfSDPLDuh3kzbB1w=' js.bizographics.com https://www.redhat.com assets.adobedtm.com jsonip.com https://ajax.googleapis.com https://www.googletagmanager.com https://www.google-analytics.com https://use.fontawesome.com; style-src 'self' https://fonts.googleapis.com https://use.fontawesome.com; img-src 'self' *; media-src 'self' ; frame-src https://www.googletagmanager.com https://www.youtube.com; frame-ancestors 'none'; base-uri 'none'; object-src 'none'; form-action 'none'; font-src 'self' https://use.fontawesome.com https://fonts.gstatic.com;">
  <META HTTP-EQUIV='X-Frame-Options' CONTENT="DENY">
  <META HTTP-EQUIV='X-XSS-Protection' CONTENT="1; mode=block">
  <META HTTP-EQUIV='X-Content-Type-Options' CONTENT="nosniff">
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <meta name="description" content="Quarkus: Supersonic Subatomic Java">
  <meta name="twitter:card" content="summary_large_image">
  <meta name="twitter:site" content="@QuarkusIO"> 
  <meta name="twitter:creator" content="@QuarkusIO">
  <meta property="og:url" content="https://quarkus.io/guides/neo4j" />
  <meta property="og:title" content="Quarkus - Neo4j" />
  <meta property="og:description" content="Quarkus: Supersonic Subatomic Java" />
  <meta property="og:image" content="/assets/images/quarkus_card.png" />
  <link rel="canonical" href="https://quarkus.io/guides/neo4j">
  <link rel="shortcut icon" type="image/png" href="/favicon.ico" >
  <link rel="stylesheet" href="https://quarkus.io/guides/stylesheet/config.css" />
  <link rel="stylesheet" href="/assets/css/main.css" />
  <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.1.0/css/all.css" integrity="sha384-lKuwvrZot6UHsBSfcMvOkWwlCMgc0TaWr+30HWe3a4ltaBwTZhyTEggF5tJv8tbt" crossorigin="anonymous">
  <link rel="alternate" type="application/rss+xml"  href="https://quarkus.io/feed.xml" title="Quarkus">
  <script src="https://quarkus.io/assets/javascript/goan.js" type="text/javascript"></script>
  <script src="https://quarkus.io/assets/javascript/hl.js" type="text/javascript"></script>
</head>

<body class="guides">
  <!-- Google Tag Manager (noscript) -->
  <noscript><iframe src="https://www.googletagmanager.com/ns.html?id=GTM-NJWS5L"
  height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
  <!-- End Google Tag Manager (noscript) -->

  <div class="nav-wrapper">
  <div class="grid-wrapper">
    <div class="width-12-12">
      <input type="checkbox" id="checkbox" />
      <nav id="main-nav" class="main-nav">
  <div class="container">
    <div class="logo-wrapper">
      
        <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_600px_reverse.png" class="project-logo" title="Quarkus"></a>
      
    </div>
    <label class="nav-toggle" for="checkbox">
      <i class="fa fa-bars"></i>
    </label>
    <div id="menu" class="menu">
      <span>
        <a href="/get-started/" class="">Get Started</a>
      </span>
      <span>
        <a href="/guides/" class="active">Guides</a>
      </span>
      <span>
        <a href="/community/" class="">Community</a>
      </span>
      <span>
        <a href="/support/" class="">Support</a>
      </span>
      <span>
        <a href="/blog/" class="">Blog</a>
      </span>
      <span>
        <a href="https://code.quarkus.io" class="button-cta secondary white">Start Coding</a>
      </span>
    </div>
  </div>
      </nav>
    </div>
  </div>
</div>

  <div class="content">
    <div class="guide">
  <div class="width-12-12">
    <h1 class="text-caps">Quarkus - Neo4j</h1>
    <div class="hide-mobile toc"><ul class="sectlevel1">
<li><a href="#programming-model">Programming model</a></li>
<li><a href="#the-domain">The domain</a></li>
<li><a href="#prerequisites">Prerequisites</a>
<ul class="sectlevel2">
<li><a href="#setup-neo4j">Setup Neo4j</a></li>
</ul>
</li>
<li><a href="#solution">Solution</a></li>
<li><a href="#creating-the-maven-project">Creating the Maven project</a></li>
<li><a href="#configuring">Configuring</a></li>
<li><a href="#using-the-driver">Using the driver</a>
<ul class="sectlevel2">
<li><a href="#general-remarks">General remarks</a></li>
<li><a href="#reading-nodes">Reading nodes</a></li>
<li><a href="#creating-nodes">Creating nodes</a></li>
<li><a href="#read-single-nodes">Read single nodes</a></li>
<li><a href="#deleting-nodes">Deleting nodes</a></li>
</ul>
</li>
<li><a href="#next-steps">Next steps</a>
<ul class="sectlevel2">
<li><a href="#packaging">Packaging</a></li>
<li><a href="#connection-health-check">Connection Health Check</a></li>
<li><a href="#explore-cypher-and-the-graph">Explore Cypher and the Graph</a></li>
<li><a href="#reactive">Going reactive</a></li>
</ul>
</li>
<li><a href="#configuration-reference">Configuration Reference</a></li>
</ul></div>
    <div>
      <div id="preamble">
<div class="sectionbody">
<div class="paragraph">
<p><a href="https://neo4j.com">Neo4j</a> is a graph database management system developed by Neo4j, Inc. Neo4j is a native graph database focused not only on the data itself, but especially on the relations between data.
Neo4j stores data as a property graph, which consists of vertices or nodes as we call them, connected with edges or relationships.
Both of them can have properties.</p>
</div>
<div class="paragraph">
<p>Neo4j offers Cypher, a declarative query language much like SQL.
Cypher is used to for both querying the graph and creating or updating nodes and relationships.
As a declarative language it used to tell the database what to do and not how to do it.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
Learn more about Cypher in the <a href="https://neo4j.com/docs/cypher-manual/current/">Neo4j Cypher manual</a>.
      Cypher is not only available in Neo4j, but for example coming to <a href="https://github.com/opencypher/morpheus">Apache Spark</a>.
      A spec called <a href="http://www.opencypher.org">OpenCypher</a> is available, too.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Clients communicate over the so called Bolt protocol with the database.</p>
</div>
<div class="paragraph">
<p>Neo4j - as the most popular graph database according to DB-Engines ranking - provides a variety of drivers for various languages.</p>
</div>
<div class="paragraph">
<p>The Quarkus Neo4j extension is based on the official <a href="https://github.com/neo4j/neo4j-java-driver">Neo4j Java Driver</a>.
The extension provides an instance of the driver configured ready for usage in any Quarkus application.
You will be able to issue arbitrary Cypher statements over Bolt with this extension.
Those statements can be simple CRUD statements as well as complex queries, calling graph algorithms and more.</p>
</div>
<div class="paragraph">
<p>The driver itself is released under the Apache 2.0 license,
while Neo4j itself is available in a GPL3-licensed open-source "community edition",
with online backup and high availability extensions licensed under a closed-source commercial license.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="paragraph">
<p>This technology is considered preview.</p>
</div>
<div class="paragraph">
<p>In <em>preview</em>, backward compatibility and presence in the ecosystem is not guaranteed.
Specific improvements might require to change configuration or APIs and plans to become <em>stable</em> are under way.
Feedback is welcome on our <a href="https://groups.google.com/d/forum/quarkus-dev">mailing list</a> or as issues in our <a href="https://github.com/quarkusio/quarkus/issues">GitHub issue tracker</a>.</p>
</div>
<div class="paragraph">
<p>For a full list of possible extension statuses, check our <a href="https://quarkus.io/faq/#extension-status">FAQ entry</a>.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
<div class="sect1">
<h2 id="programming-model"><a class="anchor" href="#programming-model"></a>Programming model</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The driver and thus the Quarkus extension support three different programming models:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Blocking database access (much like standard JDBC)</p>
</li>
<li>
<p>Asynchronous programming based on JDK&#8217;s completable futures and related infrastructure</p>
</li>
<li>
<p>Reactive programming based on <a href="http://www.reactive-streams.org">Reactive Streams</a></p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The reactive programming model is only available when connected against a 4.0+ version of Neo4j.
Reactive programming in Neo4j is fully end-to-end reactive and therefore requires a server that supports backpressure.</p>
</div>
<div class="paragraph">
<p>In this guide you will learn how to</p>
</div>
<div class="ulist">
<ul>
<li>
<p>Add the Neo4j extension to your project</p>
</li>
<li>
<p>Configure the driver</p>
</li>
<li>
<p>And how to use the driver to access a Neo4j database</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>This guide will focus on asynchronous access to Neo4j, as this is ready to use for everyone.
At the end of this guide, there will be a reactive version, which needs however a 4.0 database version.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="the-domain"><a class="anchor" href="#the-domain"></a>The domain</h2>
<div class="sectionbody">
<div class="paragraph">
<p>As with some of the other guides, the application shall manage fruit entities.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">package org.acme.neo4j;

public class Fruit {

    public Long id;

    public String name;

    public Fruit() {
        // This is needed for the REST-Easy JSON Binding
    }

    public Fruit(String name) {
        this.name = name;
    }

    public Fruit(Long id, String name) {
        this.id = id;
        this.name = name;
    }
}</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="prerequisites"><a class="anchor" href="#prerequisites"></a>Prerequisites</h2>
<div class="sectionbody">
<div class="paragraph">
<p>To complete this guide, you need:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>JDK 1.8+ installed with <code>JAVA_HOME</code> configured appropriately</p>
</li>
<li>
<p>an IDE</p>
</li>
<li>
<p>Apache Maven 3.6.2+</p>
</li>
<li>
<p>Access to a Neo4j Database</p>
</li>
<li>
<p>Optional Docker for your system</p>
</li>
</ul>
</div>
<div class="sect2">
<h3 id="setup-neo4j"><a class="anchor" href="#setup-neo4j"></a>Setup Neo4j</h3>
<div class="paragraph">
<p>The easiest way to start a Neo4j instance is a locally installed Docker environment.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">docker run --publish=7474:7474 --publish=7687:7687 -e 'NEO4J_AUTH=neo4j/secret' neo4j:4.0.0</code></pre>
</div>
</div>
<div class="paragraph">
<p>This starts a Neo4j instance, that publishes its Bolt port on <code>7687</code> and a web interface on <a href="http://localhost:7474" class="bare">http://localhost:7474</a>.</p>
</div>
<div class="paragraph">
<p>Have a look at the <a href="https://neo4j.com/download/?ref=product">download page</a> for other options to get started with the product itself.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="solution"><a class="anchor" href="#solution"></a>Solution</h2>
<div class="sectionbody">
<div class="paragraph">
<p>We recommend that you follow the instructions in the next sections and create the application step by step.
However, you can go right to the completed example.</p>
</div>
<div class="paragraph">
<p>Clone the Git repository: git clone <a href="https://github.com/quarkusio/quarkus-quickstarts.git" class="bare">https://github.com/quarkusio/quarkus-quickstarts.git</a>, or download an archive.</p>
</div>
<div class="paragraph">
<p>The solution is located in the <code>neo4j-quickstart</code> <a href="https://github.com/quarkusio/quarkus-quickstarts/tree/master/neo4j-quickstart">directory</a>.
It contains a very simple UI to use the JAX-RS resources created here, too.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="creating-the-maven-project"><a class="anchor" href="#creating-the-maven-project"></a>Creating the Maven project</h2>
<div class="sectionbody">
<div class="paragraph">
<p>First, we need a new project. Create a new project with the following command:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">mvn io.quarkus:quarkus-maven-plugin:1.7.0.Final:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=neo4j-quickstart \
    -Dextensions="neo4j,resteasy-jsonb"
cd neo4j-quickstart</code></pre>
</div>
</div>
<div class="paragraph">
<p>It generates:</p>
</div>
<div class="ulist">
<ul>
<li>
<p>the Maven structure</p>
</li>
<li>
<p>a landing page accessible on <code><a href="http://localhost:8080" class="bare">http://localhost:8080</a></code></p>
</li>
<li>
<p>example <code>Dockerfile</code> files for both <code>native</code> and <code>jvm</code> modes</p>
</li>
<li>
<p>the application configuration file</p>
</li>
<li>
<p>an <code>org.acme.datasource.GreetingResource</code> resource</p>
</li>
<li>
<p>an associated test</p>
</li>
</ul>
</div>
<div class="paragraph">
<p>The Neo4j extension has been added already to your <code>pom.xml</code>.
In addition, we added <code>resteasy-jsonb</code>, which allows us to expose <code>Fruit</code> instances over HTTP in the JSON format via JAX-RS resources.
If you have an already created project, the <code>neo4j</code> extension can be added to an existing Quarkus project with the <code>add-extension</code> command:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">./mvnw quarkus:add-extension -Dextensions="neo4j"</code></pre>
</div>
</div>
<div class="paragraph">
<p>Otherwise, you can manually add this to the dependencies section of your <code>pom.xml</code> file:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="xml" class="language-xml hljs">&lt;dependency&gt;
    &lt;groupId&gt;io.quarkus&lt;/groupId&gt;
    &lt;artifactId&gt;quarkus-neo4j&lt;/artifactId&gt;
&lt;/dependency&gt;</code></pre>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="configuring"><a class="anchor" href="#configuring"></a>Configuring</h2>
<div class="sectionbody">
<div class="paragraph">
<p>The Neo4j driver can be configured with standard Quarkus properties:</p>
</div>
<div class="listingblock">
<div class="title">src/main/resources/application.properties</div>
<div class="content">
<pre class="highlightjs highlight"><code class="language-none hljs">quarkus.neo4j.uri = bolt://localhost:7687
quarkus.neo4j.authentication.username = neo4j
quarkus.neo4j.authentication.password = secret</code></pre>
</div>
</div>
<div class="paragraph">
<p>You&#8217;ll recognize the authentication here that you passed on to the docker command above.</p>
</div>
<div class="paragraph">
<p>Having done that, the driver is ready to use, there are however other configuration options, detailed below.</p>
</div>
</div>
</div>
<div class="sect1">
<h2 id="using-the-driver"><a class="anchor" href="#using-the-driver"></a>Using the driver</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="general-remarks"><a class="anchor" href="#general-remarks"></a>General remarks</h3>
<div class="paragraph">
<p>The result of a statement consists usually of one or more <code>org.neo4j.driver.Record</code>.
Those records contain arbitrary values, supported by the driver.
If you return a node of the graph, it will be a <code>org.neo4j.driver.types.Node</code>.</p>
</div>
<div class="paragraph">
<p>We add the following method to the <code>Fruit</code>, as a convenient way to create them:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">public static Fruit from(Node node) {
    return new Fruit(node.id(), node.get("name").asString());
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>Add a <code>FruitResource</code> skeleton like this and <code>@Inject</code> a <code>org.neo4j.driver.Driver</code> instance:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/neo4j/FruitResource.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">package org.acme.neo4j;

import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import org.neo4j.driver.Driver;

@Path("fruits")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class FruitResource {

    @Inject
    Driver driver;
}</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="reading-nodes"><a class="anchor" href="#reading-nodes"></a>Reading nodes</h3>
<div class="paragraph">
<p>Add the following method to the fruit resource:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/neo4j/FruitResource.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@GET
public CompletionStage&lt;Response&gt; get() {
    AsyncSession session = driver.asyncSession(); <i class="conum" data-value="1"></i><b>(1)</b>
    return session
        .runAsync("MATCH (f:Fruit) RETURN f ORDER BY f.name")  <i class="conum" data-value="2"></i><b>(2)</b>
        .thenCompose(cursor -&gt;  <i class="conum" data-value="3"></i><b>(3)</b>
            cursor.listAsync(record -&gt; Fruit.from(record.get("f").asNode()))
        )
        .thenCompose(fruits -&gt;  <i class="conum" data-value="4"></i><b>(4)</b>
            session.closeAsync().thenApply(signal -&gt; fruits)
        )
        .thenApply(Response::ok) <i class="conum" data-value="5"></i><b>(5)</b>
        .thenApply(ResponseBuilder::build);
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>Open a new, asynchronous session with Neo4j</td>
</tr>
<tr>
<td><i class="conum" data-value="2"></i><b>2</b></td>
<td>Execute a query. This is a Cypher statement.</td>
</tr>
<tr>
<td><i class="conum" data-value="3"></i><b>3</b></td>
<td>Retrieve a cursor, list the results and create <code>Fruit</code>s.</td>
</tr>
<tr>
<td><i class="conum" data-value="4"></i><b>4</b></td>
<td>Close the session after processing</td>
</tr>
<tr>
<td><i class="conum" data-value="5"></i><b>5</b></td>
<td>Create a JAX-RS response</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Now start Quarkus in <code>dev</code> mode with:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">./mvnw compile quarkus:dev</code></pre>
</div>
</div>
<div class="paragraph">
<p>and retrieve the endpoint like this</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">curl localhost:8080/fruits</code></pre>
</div>
</div>
<div class="paragraph">
<p>There are not any fruits, so let&#8217;s create some.</p>
</div>
</div>
<div class="sect2">
<h3 id="creating-nodes"><a class="anchor" href="#creating-nodes"></a>Creating nodes</h3>
<div class="paragraph">
<p>The <code>POST</code> method looks similar.
It uses transaction functions of the driver:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/neo4j/FruitResource.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@POST
public CompletionStage&lt;Response&gt; create(Fruit fruit) {
    AsyncSession session = driver.asyncSession();
    return session
        .writeTransactionAsync(tx -&gt; tx
            .runAsync("CREATE (f:Fruit {name: $name}) RETURN f", Values.parameters("name", fruit.name))
            .thenCompose(fn -&gt; fn.singleAsync())
        )
        .thenApply(record -&gt; Fruit.from(record.get("f").asNode()))
        .thenCompose(persistedFruit -&gt; session.closeAsync().thenApply(signal -&gt; persistedFruit))
        .thenApply(persistedFruit -&gt; Response
            .created(URI.create("/fruits/" + persistedFruit.id))
            .build()
        );
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>As you can see, we are now using a Cypher statement with named parameters (The <code>$name</code> of the fruit).
The node is returned, a <code>Fruit</code> entity created and then mapped to a <code>201</code> created response.</p>
</div>
<div class="paragraph">
<p>A curl request against this path may look like this:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">curl -v -X "POST" "http://localhost:8080/fruits" \
     -H 'Content-Type: application/json; charset=utf-8' \
     -d $'{
  "name": "Banana"
}'</code></pre>
</div>
</div>
<div class="paragraph">
<p>The response contains an URI that shall return single nodes.</p>
</div>
</div>
<div class="sect2">
<h3 id="read-single-nodes"><a class="anchor" href="#read-single-nodes"></a>Read single nodes</h3>
<div class="paragraph">
<p>This time, we ask for a read-only transaction.
We also add some exception handling, in case the resource is called with an invalid id:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/neo4j/FruitResource.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@GET
@Path("{id}")
public CompletionStage&lt;Response&gt; getSingle(@PathParam("id") Long id) {
    AsyncSession session = driver.asyncSession();
    return session
        .readTransactionAsync(tx -&gt; tx
            .runAsync("MATCH (f:Fruit) WHERE id(f) = $id RETURN f", Values.parameters("id", id))
            .thenCompose(fn -&gt; fn.singleAsync())
    )
    .handle((record, exception) -&gt; {
        if(exception != null) {
            Throwable source = exception;
            if(exception instanceof CompletionException) {
                source = ((CompletionException)exception).getCause();
            }
            Status status = Status.INTERNAL_SERVER_ERROR;
            if(source instanceof NoSuchRecordException) {
                status = Status.NOT_FOUND;
            }
            return Response.status(status).build();
        } else  {
            return Response.ok(Fruit.from(record.get("f").asNode())).build();
        }
    })
    .thenCompose(response -&gt; session.closeAsync().thenApply(signal -&gt; response));
}</code></pre>
</div>
</div>
<div class="paragraph">
<p>A request may look like this:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">curl localhost:8080/fruits/42</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
In case Neo4j has been setup as a cluster, the transaction mode is used to decide whether a request is routed
      to a leader or a follower instance. Write transactions must be handled by a leader, whereas read-only transactions
      can be handled by followers.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="deleting-nodes"><a class="anchor" href="#deleting-nodes"></a>Deleting nodes</h3>
<div class="paragraph">
<p>Finally, we want to get rid of fruits again and we add the <code>DELETE</code> method:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/neo4j/FruitResource.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">@DELETE
@Path("{id}")
public CompletionStage&lt;Response&gt; delete(@PathParam("id") Long id) {

    AsyncSession session = driver.asyncSession();
    return session
        .writeTransactionAsync(tx -&gt; tx
            .runAsync("MATCH (f:Fruit) WHERE id(f) = $id DELETE f", Values.parameters("id", id))
            .thenCompose(fn -&gt; fn.consumeAsync()) <i class="conum" data-value="1"></i><b>(1)</b>
        )
        .thenCompose(response -&gt; session.closeAsync())
        .thenApply(signal -&gt; Response.noContent().build());
}</code></pre>
</div>
</div>
<div class="colist arabic">
<table>
<tr>
<td><i class="conum" data-value="1"></i><b>1</b></td>
<td>There is no result for us, only a summary of the query executed.</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>A request may look like this</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="shell" class="language-shell hljs">curl -X DELETE localhost:8080/fruits/42</code></pre>
</div>
</div>
<div class="paragraph">
<p>And that&#8217;s already the most simple CRUD application with one type of nodes.
Feel free to add relationships to the model.
One idea would be to model recipes that contain fruits.
The Cypher manual linked in the introduction will help you with modelling your queries.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="next-steps"><a class="anchor" href="#next-steps"></a>Next steps</h2>
<div class="sectionbody">
<div class="sect2">
<h3 id="packaging"><a class="anchor" href="#packaging"></a>Packaging</h3>
<div class="paragraph">
<p>Packaging your application is as simple as <code>./mvnw clean package</code>.
It can be run with <code>java -jar target/neo4j-quickstart-1.0-SNAPSHOT-runner.jar</code>.</p>
</div>
<div class="paragraph">
<p>With GraalVM installed, you can also create a native executable binary: <code>./mvnw clean package -Dnative</code>.
Depending on your system, that will take some time.</p>
</div>
</div>
<div class="sect2">
<h3 id="connection-health-check"><a class="anchor" href="#connection-health-check"></a>Connection Health Check</h3>
<div class="paragraph">
<p>If you are using the <code>quarkus-smallrye-health</code> extension, <code>quarkus-neo4j</code> will automatically add a readiness health check
to validate the connection to Neo4j.</p>
</div>
<div class="paragraph">
<p>So when you access the <code>/health/ready</code> endpoint of your application you will have information about the connection validation status.</p>
</div>
<div class="paragraph">
<p>This behavior can be disabled by setting the <code>quarkus.neo4j.health.enabled</code> property to <code>false</code> in your <code>application.properties</code>.</p>
</div>
</div>
<div class="sect2">
<h3 id="explore-cypher-and-the-graph"><a class="anchor" href="#explore-cypher-and-the-graph"></a>Explore Cypher and the Graph</h3>
<div class="paragraph">
<p>There are tons of options to model your domain within a Graph.
The <a href="https://neo4j.com/docs/">Neo4j docs</a>, the sandboxes and more are a good starting point.</p>
</div>
</div>
<div class="sect2">
<h3 id="reactive"><a class="anchor" href="#reactive"></a>Going reactive</h3>
<div class="paragraph">
<p>If you have access to Neo4j 4.0, you can go fully reactive.</p>
</div>
<div class="paragraph">
<p>To make life a bit easier, we will use <a href="https://smallrye.io/smallrye-mutiny/">Mutiny</a> for this.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<i class="fa icon-tip" title="Tip"></i>
</td>
<td class="content">
<div class="title">Mutiny</div>
<div class="paragraph">
<p>The following example uses Mutiny reactive types, if you&#8217;re not familiar with them, read the <a href="getting-started-reactive#mutiny">Getting Started with Reactive guide</a> first.</p>
</div>
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Add the following dependency to your <code>pom.xml</code>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlightjs highlight"><code data-lang="xml" class="language-xml hljs">&lt;dependencies&gt;
    &lt;dependency&gt;
        &lt;groupId&gt;io.quarkus&lt;/groupId&gt;
        &lt;artifactId&gt;quarkus-resteasy-mutiny&lt;/artifactId&gt;
    &lt;/dependency&gt;
&lt;/dependencies&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>The reactive fruit resources streams the name of all fruits:</p>
</div>
<div class="listingblock">
<div class="title">src/main/java/org/acme/neo4j/ReactiveFruitResource.java</div>
<div class="content">
<pre class="highlightjs highlight"><code data-lang="java" class="language-java hljs">package org.acme.neo4j;

import javax.inject.Inject;
import javax.ws.rs.Consumes;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;

import io.smallrye.mutiny.Multi;
import io.smallrye.mutiny.Uni;
import org.neo4j.driver.Driver;
import org.neo4j.driver.reactive.RxResult;
import org.reactivestreams.Publisher;


@Path("reactivefruits")
@Produces(MediaType.APPLICATION_JSON)
@Consumes(MediaType.APPLICATION_JSON)
public class ReactiveFruitResource {

    @Inject
    Driver driver;

    @GET
    @Produces(MediaType.SERVER_SENT_EVENTS)
    public Publisher&lt;String&gt; get() {
        // Create a stream from a resource we can close in a finalizer:
        return Multi.createFrom().resource(driver::rxSession,
                session -&gt; session.readTransaction(tx -&gt; {
                    RxResult result = tx.run("MATCH (f:Fruit) RETURN f.name as name ORDER BY f.name");
                    return Multi.createFrom().publisher(result.records())
                            .map(record -&gt; record.get("name").asString());
                })
        ).withFinalizer(session -&gt; {
            return Uni.createFrom().publisher(session.close());
        });
    }
}</code></pre>
</div>
</div>
<div class="paragraph">
<p><code>driver.rxSession()</code> returns a reactive session.
It exposes its API based on <a href="http://www.reactive-streams.org">Reactive Streams</a>, most prominently, as <code>org.reactivestreams.Publisher</code>.
Those can be used directly, but we found it easier and more expressive to wrap them in reactive types such as the one provided by Mutiny.
Typically, in the previous code, the session is closed when the stream completes, fails or the subscriber cancels.</p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="configuration-reference"><a class="anchor" href="#configuration-reference"></a>Configuration Reference</h2>
<div class="sectionbody">
<div class="paragraph configuration-legend">
<p><span class="icon"><i class="fa fa-lock" title="Fixed at build time"></i></span> Configuration property fixed at build time - All other configuration properties are overridable at runtime</p>
</div>
<table class="tableblock frame-all grid-all stretch configuration-reference searchable">
<colgroup>
<col style="width: 80%;">
<col style="width: 10%;">
<col style="width: 10%;">
</colgroup>
<tbody>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock"><a id="quarkus-neo4j_configuration"></a><a href="#quarkus-neo4j_configuration">Configuration property</a></p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Type</p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Default</p></th>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><span class="icon"><i class="fa fa-lock" title="Fixed at build time"></i></span> <a id="quarkus-neo4j_quarkus.neo4j.health.enabled"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.health.enabled">quarkus.neo4j.health.enabled</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Whether or not an health check is published in case the smallrye-health extension is present.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>true</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-neo4j_quarkus.neo4j.uri"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.uri">quarkus.neo4j.uri</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The uri this driver should connect to. The driver supports bolt, bolt&#43;routing or neo4j as schemes.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>bolt://localhost:7687</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-neo4j_quarkus.neo4j.encrypted"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.encrypted">quarkus.neo4j.encrypted</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>If the driver should use encrypted traffic.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock"><a id="quarkus-neo4j_quarkus.neo4j.authentication"></a><a href="#quarkus-neo4j_quarkus.neo4j.authentication">Authentication</a></p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Type</p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Default</p></th>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-neo4j_quarkus.neo4j.authentication.username"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.authentication.username">quarkus.neo4j.authentication.username</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The login of the user connecting to the database.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>neo4j</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-neo4j_quarkus.neo4j.authentication.password"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.authentication.password">quarkus.neo4j.authentication.password</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The password of the user connecting to the database.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">string</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>neo4j</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-neo4j_quarkus.neo4j.authentication.disabled"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.authentication.disabled">quarkus.neo4j.authentication.disabled</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Set this to true to disable authentication.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock"><a id="quarkus-neo4j_quarkus.neo4j.trust-settings"></a><a href="#quarkus-neo4j_quarkus.neo4j.trust-settings">Configure trust settings for encrypted traffic</a></p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Type</p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Default</p></th>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-neo4j_quarkus.neo4j.trust-settings.strategy"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.trust-settings.strategy">quarkus.neo4j.trust-settings.strategy</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Configures which trust strategy to apply when using encrypted traffic.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>trust-all-certificates</code>, <code>trust-custom-ca-signed-certificates</code>, <code>trust-system-ca-signed-certificates</code></p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>trust-system-ca-signed-certificates</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-neo4j_quarkus.neo4j.trust-settings.cert-file"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.trust-settings.cert-file">quarkus.neo4j.trust-settings.cert-file</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The file of the certificate to use.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">path</p></td>
<td class="tableblock halign-left valign-middle"></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-neo4j_quarkus.neo4j.trust-settings.hostname-verification-enabled"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.trust-settings.hostname-verification-enabled">quarkus.neo4j.trust-settings.hostname-verification-enabled</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>If hostname verification is used.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<th class="tableblock halign-left valign-top"><p class="tableblock"><a id="quarkus-neo4j_quarkus.neo4j.pool"></a><a href="#quarkus-neo4j_quarkus.neo4j.pool">Connection pool</a></p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Type</p></th>
<th class="tableblock halign-left valign-middle"><p class="tableblock">Default</p></th>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-neo4j_quarkus.neo4j.pool.metrics-enabled"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.pool.metrics-enabled">quarkus.neo4j.pool.metrics-enabled</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Flag, if metrics are enabled.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-neo4j_quarkus.neo4j.pool.log-leaked-sessions"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.pool.log-leaked-sessions">quarkus.neo4j.pool.log-leaked-sessions</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Flag, if leaked sessions logging is enabled.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">boolean</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>false</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-neo4j_quarkus.neo4j.pool.max-connection-pool-size"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.pool.max-connection-pool-size">quarkus.neo4j.pool.max-connection-pool-size</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>The maximum amount of connections in the connection pool towards a single database.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock">int</p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>100</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-neo4j_quarkus.neo4j.pool.idle-time-before-connection-test"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.pool.idle-time-before-connection-test">quarkus.neo4j.pool.idle-time-before-connection-test</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Pooled connections that have been idle in the pool for longer than this timeout will be tested before they are used again. The value <code>0</code> means connections will always be tested for validity and negative values mean connections will never be tested.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html">Duration</a>
  <a href="#duration-note-anchor" title="More information about the Duration format"><span class="icon"><i class="fa fa-question-circle"></i></span></a></p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>-0.001S</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-neo4j_quarkus.neo4j.pool.max-connection-lifetime"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.pool.max-connection-lifetime">quarkus.neo4j.pool.max-connection-lifetime</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Pooled connections older than this threshold will be closed and removed from the pool.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html">Duration</a>
  <a href="#duration-note-anchor" title="More information about the Duration format"><span class="icon"><i class="fa fa-question-circle"></i></span></a></p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>1H</code></p></td>
</tr>
<tr>
<td class="tableblock halign-left valign-top"><div class="content"><div class="paragraph">
<p><a id="quarkus-neo4j_quarkus.neo4j.pool.connection-acquisition-timeout"></a><code><a href="#quarkus-neo4j_quarkus.neo4j.pool.connection-acquisition-timeout">quarkus.neo4j.pool.connection-acquisition-timeout</a></code></p>
</div>
<div class="openblock description">
<div class="content">
<div class="paragraph">
<p>Acquisition of new connections will be attempted for at most configured timeout.</p>
</div>
</div>
</div></div></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><a href="https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html">Duration</a>
  <a href="#duration-note-anchor" title="More information about the Duration format"><span class="icon"><i class="fa fa-question-circle"></i></span></a></p></td>
<td class="tableblock halign-left valign-middle"><p class="tableblock"><code>1M</code></p></td>
</tr>
</tbody>
</table>
<div id="duration-note-anchor" class="admonitionblock note">
<table>
<tr>
<td class="icon">
<i class="fa icon-note" title="Note"></i>
</td>
<td class="content">
<div class="title">About the Duration format</div>
<div class="paragraph">
<p>The format for durations uses the standard <code>java.time.Duration</code> format.
You can learn more about it in the <a href="https://docs.oracle.com/javase/8/docs/api/java/time/Duration.html#parse-java.lang.CharSequence-">Duration#parse() javadoc</a>.</p>
</div>
<div class="paragraph">
<p>You can also provide duration values starting with a number.
In this case, if the value consists only of a number, the converter treats the value as seconds.
Otherwise, <code>PT</code> is implicitly prepended to the value to obtain a standard <code>java.time.Duration</code> format.</p>
</div>
</td>
</tr>
</table>
</div>
</div>
</div>
    </div>
  </div>
</div>

  </div>

  <div class="content project-footer">
  <div class="footer-section">
    <div class="logo-wrapper">
      <a href="/"><img src="/assets/images/quarkus_logo_horizontal_rgb_reverse.svg" class="project-logo" title="Quarkus"></a>
    </div>
  </div>
  <div class="grid-wrapper">
    <p class="grid__item width-3-12">Quarkus is open. All dependencies of this project are available under the <a href='https://www.apache.org/licenses/LICENSE-2.0' target='_blank'>Apache Software License 2.0</a> or compatible license.<br /><br />This website was built with <a href='https://jekyllrb.com/' target='_blank'>Jekyll</a>, is hosted on <a href='https://pages.github.com/' target='_blank'>Github Pages</a> and is completely open source. If you want to make it better, <a href='https://github.com/quarkusio/quarkusio.github.io' target='_blank'>fork the website</a> and show us what you’ve got.</p>

    
      <div class="width-1-12 project-links">
        <span>Navigation</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="/">Home</a></li>
          
            <li><a href="/guides">Guides</a></li>
          
            <li><a href="/community/#contributing">Contribute</a></li>
          
            <li><a href="/faq">FAQ</a></li>
          
            <li><a href="/get-started">Get Started</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Contribute</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://twitter.com/quarkusio">Follow us</a></li>
          
            <li><a href="https://github.com/quarkusio">GitHub</a></li>
          
            <li><a href="/security">Security&nbsp;policy</a></li>
          
        </ul>
      </div>
    
      <div class="width-1-12 project-links">
        <span>Get Help</span>
        <ul class="footer-links width-1-12">
          
            <li><a href="https://groups.google.com/forum/#!forum/quarkus-dev">Forums</a></li>
          
            <li><a href="https://quarkusio.zulipchat.com">Chatroom</a></li>
          
        </ul>
      </div>
    

    
      <div class="width-3-12 more-links">
        <span>Quarkus is made of community projects</span>
        <ul class="footer-links">
          
            <li><a href="https://vertx.io/" target="_blank">Eclipse Vert.x</a></li>
          
            <li><a href="https://microprofile.io" target="_blank">Eclipse MicroProfile</a></li>
          
            <li><a href="https://hibernate.org" target="_blank">Hibernate</a></li>
          
            <li><a href="https://netty.io" target="_blank">Netty</a></li>
          
            <li><a href="https://resteasy.github.io" target="_blank">RESTEasy</a></li>
          
            <li><a href="https://camel.apache.org" target="_blank">Apache Camel</a></li>
          
            <li><a href="https://code.quarkus.io/" target="_blank">And many more...</a></li>
          
        </ul>
      </div>
    
  </div>
</div>
  <div class="content redhat-footer">
  <div class="grid-wrapper">
    <span class="licence">
      <i class="fab fa-creative-commons"></i><i class="fab fa-creative-commons-by"></i> <a href="https://creativecommons.org/licenses/by/3.0/" target="_blank">CC by 3.0</a> | <a href="https://www.redhat.com/en/about/privacy-policy">Privacy Policy</a>
    </span>
    <span class="redhat">
      Sponsored by
    </span>
    <span class="redhat-logo">
      <a href="https://www.redhat.com/" target="_blank"><img src="/assets/images/redhat_reversed.svg"></a>
    </span>
  </div>
</div>


  <script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.4/jquery.min.js" integrity="sha384-8gBf6Y4YYq7Jx97PIqmTwLPin4hxIzQw5aDmUg/DDhul9fFpbbLcLh3nTIIDJKhx" crossorigin="anonymous"></script>
  <script type="text/javascript" src="/assets/javascript/mobile-nav.js"></script>
  <script type="text/javascript" src="/assets/javascript/scroll-down.js"></script>
  <script src="/assets/javascript/satellite.js" type="text/javascript"></script>
  <script src="https://quarkus.io/guides/javascript/config.js" type="text/javascript"></script>
  <script src="/assets/javascript/search-filter.js" type="text/javascript"></script>
  <script src="/assets/javascript/back-to-top.js" type="text/javascript"></script>
</body>

</html>
